/*
 * GraphQL输入对象类型 - 人员部件Where输入对象GraphQL类型
 * 
 * 主要功能：
 * - 为PersonPart定义GraphQL Where过滤条件
 * - 基于内容部件索引自动生成YesSql逻辑
 * - 支持数据库端过滤
 * - 提供类型安全的GraphQL过滤接口
 */

using GraphQL.Types;
using Lombiq.TrainingDemo.Indexes;
using Lombiq.TrainingDemo.Models;
using OrchardCore.Apis.GraphQL.Queries;
using static Lombiq.TrainingDemo.GraphQL.Services.PersonPartObjectGraphType;

namespace Lombiq.TrainingDemo.GraphQL.Services;

/// <summary>
/// 人员部件Where输入对象GraphQL类型 - 为PersonPart定义GraphQL Where过滤条件
/// 
/// 主要用途：
/// - 为PersonPart定义GraphQL Where过滤条件
 //* - 基于内容部件索引自动生成YesSql逻辑
 //* - 支持数据库端过滤
 //* - 提供类型安全的GraphQL过滤接口
 //* 
 //* 使用场景：
/// - 在GraphQL查询中过滤人员数据
/// - 支持按出生日期过滤
/// - 支持按惯用手过滤
/// - 提供GraphiQL中的下拉选择界面
/// 
/// 设计原因：
/// - 为内容部件提供GraphQL过滤支持
/// - 利用索引实现高效的数据库查询
/// - 提供统一的过滤接口定义
/// - 支持类型安全的过滤条件
/// 
/// 设计模式：
/// - 继承模式：继承WhereInputObjectGraphType<T>实现过滤类型
/// - 索引模式：基于索引字段定义过滤条件
/// - 枚举模式：使用枚举类型提供下拉选择
/// - 描述模式：为过滤字段提供描述信息
/// </summary>
// 此类在"where"过滤器中添加内容部件特定的部分。它依赖于内容部件索引来自动生成YesSql逻辑以进行数据库端过滤。
public class PersonPartWhereInputObjectGraphType : WhereInputObjectGraphType<PersonPart>
{
    /// <summary>
    /// 构造函数 - 定义PersonPart的GraphQL过滤字段
    /// 
    /// 功能说明：
    /// - 基于索引字段定义过滤条件
    /// - 使用枚举类型提供下拉选择
    /// - 为过滤字段提供描述信息
    /// - 支持数据库端的高效过滤
    /// 
    /// 过滤字段：
    /// - BirthDateUtc：出生日期过滤
    /// - Handedness：惯用手过滤（枚举下拉）
    /// </summary>
    public PersonPartWhereInputObjectGraphType()
    {
        // 由于过滤器依赖于索引，我们使用它们的"nameof"作为引用。
        AddScalarFilterFields<DateTimeGraphType>(nameof(PersonPartIndex.BirthDateUtc), BirthDateDescription);

        // 使用枚举图类型将过滤器转换为GraphiQL中有效选项的下拉菜单。
        AddScalarFilterFields<HandednessEnumerationGraphType>(nameof(PersonPartIndex.Handedness), HandednessDescription);
    }
}

// 下一站：Services/PersonPartIndexAliasProvider.cs
